using BaseData.ErrorCode;
using BaseData.WriteApi.Application.Command.Permissions;
using BaseData.WriteApi.Application.Command.Roles;
using BaseData.WriteApi.Application.Command.Users;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace BaseData.WriteApi.Controllers
{
    /// <summary>
    /// 用户操作相关接口控制器
    /// </summary>
    [Route("api/[controller]/[action]")] // 路由配置，表示访问此控制器的路由规则
    [ApiController]  // 标记为API控制器，启用一些API相关的默认行为
    [Authorize]  // 确保该控制器的操作需要进行身份认证
    public class OperateController : ControllerBase
    {
        private readonly IMediator mediator;  // 中介者模式，用于解耦和协调各个处理器之间的交互
        private readonly ILogger<OperateController> logger;  // 日志记录器

        /// <summary>
        /// 构造函数，初始化控制器
        /// </summary>
        /// <param name="_mediator">中介者，用于处理命令和查询</param>
        /// <param name="_logger">日志记录器，用于记录日志信息</param>
        public OperateController(IMediator _mediator, ILogger<OperateController> _logger)
        {
            mediator = _mediator;  // 注入中介者
            logger = _logger;  // 注入日志记录器
        }

        /// <summary>
        /// 插入用户的接口
        /// </summary>
        /// <param name="cmd">包含用户信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPost]  // HTTP POST 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> InsertUserAsync(InsertUserCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }

        /// <summary>
        /// 插入角色的接口
        /// </summary>
        /// <param name="cmd">包含角色信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPost]  // HTTP POST 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> InsertRoleAsync(InsertRoleCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }
        /// <summary>
        /// 插入权限的接口
        /// </summary>
        /// <param name="cmd">包含权限信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPost]  // HTTP POST 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> InsertPermissionAsync(InsertPermissionCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }

        /// <summary>
        /// 更新用户信息的接口
        /// </summary>
        /// <param name="cmd">包含用户更新信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPut]  // HTTP PUT 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> UpdateUserAsync(UpdateUserCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }

        /// <summary>
        /// 更新角色信息的接口
        /// </summary>
        /// <param name="cmd">包含角色更新信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPut]  // HTTP PUT 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> UpdateRoleAsync(UpdateRoleCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }

        /// <summary>
        /// 更新权限信息的接口
        /// </summary>
        /// <param name="cmd">包含权限更新信息的命令</param>
        /// <returns>返回操作结果</returns>
        [HttpPut]  // HTTP PUT 请求
        [AllowAnonymous]  // 允许匿名访问，无需身份验证
        public async Task<Apiresult<int>> UpdatePermissionAsync(UpdatePermissionCommand cmd)
        {
            try
            {
                // 使用中介者发送命令并获取处理结果
                return await mediator.Send(cmd);
            }
            catch (Exception)
            {
                // 捕获异常并重新抛出
                throw;
            }
        }
    }
}

